home *** CD-ROM | disk | FTP | other *** search
- { ********************************************************************** }
- { }
- { Delphi and Kylix Cross-Platform Open Tools API }
- { }
- { Copyright (C) 1995, 2001 Borland Software Corporation }
- { }
- { All Rights Reserved. }
- { }
- { ********************************************************************** }
-
-
- unit DesignEditors;
-
- interface
-
- uses
- Types, SysUtils, Classes, TypInfo, Variants, DesignIntf, DesignMenus;
-
- { Property Editors }
-
- type
- TInstProp = record
- Instance: TPersistent;
- PropInfo: PPropInfo;
- end;
-
- PInstPropList = ^TInstPropList;
- TInstPropList = array[0..1023] of TInstProp;
-
- TPropertyEditor = class(TBasePropertyEditor, IProperty)
- protected
- procedure SetPropEntry(Index: Integer; AInstance: TPersistent;
- APropInfo: PPropInfo); override;
- protected
- function GetFloatValue: Extended;
- function GetFloatValueAt(Index: Integer): Extended;
- function GetInt64Value: Int64;
- function GetInt64ValueAt(Index: Integer): Int64;
- function GetMethodValue: TMethod;
- function GetMethodValueAt(Index: Integer): TMethod;
- function GetOrdValue: Longint;
- function GetOrdValueAt(Index: Integer): Longint;
- function GetStrValue: string;
- function GetStrValueAt(Index: Integer): string;
- function GetVarValue: Variant;
- function GetVarValueAt(Index: Integer): Variant;
- function GetIntfValue: IInterface;
- function GetIntfValueAt(Index: Integer): IInterface;
- procedure Modified;
- procedure SetFloatValue(Value: Extended);
- procedure SetMethodValue(const Value: TMethod);
- procedure SetInt64Value(Value: Int64);
- procedure SetOrdValue(Value: Longint);
- procedure SetStrValue(const Value: string);
- procedure SetVarValue(const Value: Variant);
- procedure SetIntfValue(const Value: IInterface);
- protected
- { IProperty }
- function GetEditValue(out Value: string): Boolean;
- function HasInstance(Instance: TPersistent): Boolean;
- public
- constructor Create(const ADesigner: IDesigner; APropCount: Integer); override;
- destructor Destroy; override;
- procedure Activate; virtual;
- function AllEqual: Boolean; virtual;
- function AutoFill: Boolean; virtual;
- procedure Edit; virtual;
- function GetAttributes: TPropertyAttributes; virtual;
- function GetComponent(Index: Integer): TPersistent;
- function GetEditLimit: Integer; virtual;
- function GetName: string; virtual;
- procedure GetProperties(Proc: TGetPropProc); virtual;
- function GetPropInfo: PPropInfo; virtual;
- function GetPropType: PTypeInfo;
- function GetValue: string; virtual;
- function GetVisualValue: string;
- procedure GetValues(Proc: TGetStrProc); virtual;
- procedure Initialize; override;
- procedure Revert;
- procedure SetValue(const Value: string); virtual;
- function ValueAvailable: Boolean;
- property Designer: IDesigner;
- property PrivateDirectory: string;
- property PropCount: Integer;
- property Value: string;
- end;
-
- { TOrdinalProperty
- The base class of all ordinal property editors. It established that ordinal
- properties are all equal if the GetOrdValue all return the same value. }
-
- TOrdinalProperty = class(TPropertyEditor)
- function AllEqual: Boolean; override;
- function GetEditLimit: Integer; override;
- end;
-
- { TIntegerProperty
- Default editor for all Longint properties and all subtypes of the Longint
- type (i.e. Integer, Word, 1..10, etc.). Restricts the value entered into
- the property to the range of the sub-type. }
-
- TIntegerProperty = class(TOrdinalProperty)
- public
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TCharProperty
- Default editor for all Char properties and sub-types of Char (i.e. Char,
- 'A'..'Z', etc.). }
-
- TCharProperty = class(TOrdinalProperty)
- public
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TEnumProperty
- The default property editor for all enumerated properties (e.g. TShape =
- (sCircle, sTriangle, sSquare), etc.). }
-
- TEnumProperty = class(TOrdinalProperty)
- public
- function GetAttributes: TPropertyAttributes; override;
- function GetValue: string; override;
- procedure GetValues(Proc: TGetStrProc); override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TBoolProperty is now obsolete. TEnumProperty handles bool types. }
- TBoolProperty = class(TEnumProperty)
- end deprecated;
-
- { TInt64Property
- Default editor for all Int64 properties and all subtypes of Int64. }
-
- TInt64Property = class(TPropertyEditor)
- public
- function AllEqual: Boolean; override;
- function GetEditLimit: Integer; override;
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TFloatProperty
- The default property editor for all floating point types (e.g. Float,
- Single, Double, etc.) }
-
- TFloatProperty = class(TPropertyEditor)
- public
- function AllEqual: Boolean; override;
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TStringProperty
- The default property editor for all strings and sub types (e.g. string,
- string[20], etc.). }
-
- TStringProperty = class(TPropertyEditor)
- public
- function AllEqual: Boolean; override;
- function GetEditLimit: Integer; override;
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TNestedProperty
- A property editor that uses the parent's Designer, PropList and PropCount.
- The constructor and destructor do not call inherited, but all derived classes
- should. This is useful for properties like the TSetElementProperty. }
-
- TNestedProperty = class(TPropertyEditor)
- public
- constructor Create(Parent: TPropertyEditor); reintroduce;
- destructor Destroy; override;
- end;
-
- { TSetElementProperty
- A property editor that edits an individual set element. GetName is
- changed to display the set element name instead of the property name and
- Get/SetValue is changed to reflect the individual element state. This
- editor is created by the TSetProperty editor. }
-
- TSetElementProperty = class(TNestedProperty)
- protected
- constructor Create(Parent: TPropertyEditor; AElement: Integer); reintroduce;
- property Element: Integer;
- public
- function AllEqual: Boolean; override;
- function GetAttributes: TPropertyAttributes; override;
- function GetName: string; override;
- function GetValue: string; override;
- procedure GetValues(Proc: TGetStrProc); override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TSetProperty
- Default property editor for all set properties. This editor does not edit
- the set directly but will display sub-properties for each element of the
- set. GetValue displays the value of the set in standard set syntax. }
-
- TSetProperty = class(TOrdinalProperty)
- public
- function GetAttributes: TPropertyAttributes; override;
- procedure GetProperties(Proc: TGetPropProc); override;
- function GetValue: string; override;
- end;
-
- { TClassProperty
- Default property editor for all objects. Does not allow modifying the
- property but does display the class name of the object and will allow the
- editing of the object's properties as sub-properties of the property. }
-
- TClassProperty = class(TPropertyEditor)
- public
- function GetAttributes: TPropertyAttributes; override;
- procedure GetProperties(Proc: TGetPropProc); override;
- function GetValue: string; override;
- end;
-
- { TMethodProperty
- Property editor for all method properties. }
-
- TMethodProperty = class(TPropertyEditor, IMethodProperty)
- public
- function AllNamed: Boolean; virtual;
- function AllEqual: Boolean; override;
- procedure Edit; override;
- function GetAttributes: TPropertyAttributes; override;
- function GetEditLimit: Integer; override;
- function GetValue: string; override;
- procedure GetValues(Proc: TGetStrProc); override;
- procedure SetValue(const AValue: string); override;
- function GetFormMethodName: string; virtual;
- function GetTrimmedEventName: string;
- end;
-
- { TComponentProperty
- The default editor for TComponents. It does not allow editing of the
- properties of the component. It allow the user to set the value of this
- property to point to a component in the same form that is type compatible
- with the property being edited (e.g. the ActiveControl property). }
-
- TComponentProperty = class(TPropertyEditor, IReferenceProperty)
- protected
- function FilterFunc(const ATestEditor: IProperty): Boolean;
- function GetComponentReference: TComponent; virtual;
- function GetSelections: IDesignerSelections; virtual;
- public
- function AllEqual: Boolean; override;
- procedure Edit; override;
- function GetAttributes: TPropertyAttributes; override;
- procedure GetProperties(Proc: TGetPropProc); override;
- function GetEditLimit: Integer; override;
- function GetValue: string; override;
- procedure GetValues(Proc: TGetStrProc); override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TInterfaceProperty
- The default editor for interface references. It allows the user to set
- the value of this property to refer to an interface implemented by
- a component on the form (or via form linking) that is type compatible
- with the property being edited. }
-
- TInterfaceProperty = class(TComponentProperty)
- protected
- procedure ReceiveComponentNames(const S: string);
- function GetComponent(const AInterface: IInterface): TComponent;
- function GetComponentReference: TComponent; override;
- function GetSelections: IDesignerSelections; override;
- public
- function AllEqual: Boolean; override;
- procedure GetValues(Proc: TGetStrProc); override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TComponentNameProperty
- Property editor for the Name property. It restricts the name property
- from being displayed when more than one component is selected. }
-
- TComponentNameProperty = class(TStringProperty)
- public
- function GetAttributes: TPropertyAttributes; override;
- function GetEditLimit: Integer; override;
- end;
-
- { TDateProperty
- Property editor for date portion of TDateTime type. }
-
- TDateProperty = class(TPropertyEditor)
- function GetAttributes: TPropertyAttributes; override;
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TTimeProperty
- Property editor for time portion of TDateTime type. }
-
- TTimeProperty = class(TPropertyEditor)
- function GetAttributes: TPropertyAttributes; override;
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TDateTimeProperty
- Edits both date and time data simultaneously }
-
- TDateTimeProperty = class(TPropertyEditor)
- function GetAttributes: TPropertyAttributes; override;
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- end;
-
- { TVariantProperty }
-
- TVariantProperty = class(TPropertyEditor)
- function GetAttributes: TPropertyAttributes; override;
- function GetValue: string; override;
- procedure SetValue(const Value: string); override;
- procedure GetProperties(Proc: TGetPropProc); override;
- end;
-
- procedure GetComponentProperties(const Components: IDesignerSelections;
- Filter: TTypeKinds; const Designer: IDesigner; Proc: TGetPropProc;
- EditorFilterFunc: TPropertyEditorFilterFunc = nil);
-
- { Component Editors }
-
- type
- { TComponentEditor
- This class provides a default implementation for the IComponentEditor
- interface. There is no assumption by the designer that you use this class
- only that your class derive from TBaseComponentEditor and implement
- IComponentEditor. This class is provided to help you implement a class
- that meets those requirements. }
- TComponentEditor = class(TBaseComponentEditor, IComponentEditor)
- public
- constructor Create(AComponent: TComponent; ADesigner: IDesigner); override;
- procedure Edit; virtual;
- procedure ExecuteVerb(Index: Integer); virtual;
- function GetComponent: TComponent;
- function GetDesigner: IDesigner;
- function GetVerb(Index: Integer): string; virtual;
- function GetVerbCount: Integer; virtual;
- function IsInInlined: Boolean;
- procedure Copy; virtual;
- procedure PrepareItem(Index: Integer; const AItem: IMenuItem); virtual;
- property Component: TComponent;
- property Designer: IDesigner;
- end;
-
- { TDefaultEditor
- An editor that provides default behavior for the double-click that will
- iterate through the properties looking the the most appropriate method
- property to edit }
- TDefaultEditor = class(TComponentEditor, IDefaultEditor)
- protected
- procedure EditProperty(const Prop: IProperty; var Continue: Boolean); virtual;
- public
- procedure Edit; override;
- end;
-
- function GetComponentEditor(Component: TComponent;
- const Designer: IDesigner): IComponentEditor;
-
- { Selection Editors }
-
- type
-
- { TSelectionEditor
- This provides a default implementation of the ISelectionEditor interface.
- There is no assumption by the designer that you use this class only that
- you have a class derived from TBaseSelectionEditor and implements the
- ISelectionEdtior interface. This class is provided to help you implement a
- class the meets those requirements. This class is also the selection editor
- that will be created if no other selection editor is registered for a class. }
- TSelectionEditor = class(TBaseSelectionEditor, ISelectionEditor)
- public
- constructor Create(const ADesigner: IDesigner); override;
- procedure ExecuteVerb(Index: Integer; const List: IDesignerSelections); virtual;
- function GetVerb(Index: Integer): string; virtual;
- function GetVerbCount: Integer; virtual;
- procedure RequiresUnits(Proc: TGetStrProc); virtual;
- procedure PrepareItem(Index: Integer; const AItem: IMenuItem); virtual;
- property Designer: IDesigner;
- end;
-
- function GetSelectionEditors(const Designer: IDesigner): ISelectionEditorList; overload;
- function GetSelectionEditors(const Designer: IDesigner;
- const Selections: IDesignerSelections): ISelectionEditorList; overload;
- function GetSelectionEditors(const Designer: IDesigner;
- Component: TComponent): ISelectionEditorList; overload;
-
- type
- { TEditActionSelectionEditor }
-
- TEditActionSelectionEditor = class(TSelectionEditor)
- protected
- function GetEditState: TEditState;
- procedure EditAction(Action: TEditAction);
-
- procedure HandleCopy(Sender: TObject);
- procedure HandleCut(Sender: TObject);
- procedure HandleDelete(Sender: TObject);
- procedure HandlePaste(Sender: TObject);
- procedure HandleSelectAll(Sender: TObject);
- procedure HandleUndo(Sender: TObject);
- public
- function GetVerb(Index: Integer): string; override;
- function GetVerbCount: Integer; override;
- procedure PrepareItem(Index: Integer; const AItem: IMenuItem); override;
- end;
-
- { Custom Modules }
-
- type
- { TCustomModule
- This class provides a default implementation of the ICustomModule interface.
- There is no assumption by the designer that a custom module derives form
- this class only that it derive from TBaseCustomModule and implement the
- ICustomModule interface. This class is provided to help you implement a
- class that meets those requirements. }
- TCustomModule = class(TBaseCustomModule, ICustomModule)
- public
- constructor Create(ARoot: TComponent; const ADesigner: IDesigner); override;
- destructor Destroy; override;
- procedure ExecuteVerb(Index: Integer); virtual;
- function GetAttributes: TCustomModuleAttributes; virtual;
- function GetVerb(Index: Integer): string; virtual;
- function GetVerbCount: Integer; virtual;
- procedure Saving; virtual;
- procedure PrepareItem(Index: Integer; const AItem: IMenuItem); virtual;
- procedure ValidateComponent(Component: TComponent); virtual;
- function ValidateComponentClass(ComponentClass: TComponentClass): Boolean; virtual;
- function Nestable: Boolean; virtual;
- property Root: TComponent;
- property Designer: IDesigner;
- end;
-
- { ClassInheritsFrom
- Returns true if ClassType, or one of its ancestors, name matches
- ClassName. This allows checking ancestor by name instead of by class
- reference. }
-
- function ClassInheritsFrom(ClassType: TClass; const ClassName: string): Boolean;
-
- { AncestorNameMatches
- Returns true if either ClassType descends from AncestorClass or doesn't
- contain an ancestor class by the same name as AncestorClass. This ensures that
- if ClassType has an ancestor by the same name it is AncestorClass. }
-
- function AncestorNameMatches(ClassType: TClass; AncestorClass: TClass): Boolean;
-
- { Find the top level component (form, module, etc) }
-
- type
- TGetTopLevelComponentFunc = function(Ignoring: TComponent = nil): TComponent;
-
- var
- GetTopLevelComponentFunc: TGetTopLevelComponentFunc;
-
- resourcestring
- sClassNotApplicable = 'Class %s is not applicable to this module';
- sNotAvailable = '(Not available)';
-
- function PossibleStream(const S: string): Boolean;
-
- { Routines used by the form designer for package management }
-
- type
- TGroupChangeProc = procedure(AGroup: Integer);
-
- IDesignGroupChange = interface
- ['{8B5614E7-A726-4622-B2A7-F79340B1B78E}']
- procedure FreeEditorGroup(Group: Integer);
- end;
-
- function NewEditorGroup: Integer;
- procedure FreeEditorGroup(Group: Integer);
- procedure NotifyGroupChange(AProc: TGroupChangeProc);
- procedure UnnotifyGroupChange(AProc: TGroupChangeProc);
-
- var
- GReferenceExpandable: Boolean = True;
- GShowReadOnlyProps: Boolean = True;
-
- implementation
-